package com.ruoyi.fjtseac.util;

import org.apache.commons.io.FileUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Repository;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import ws.schild.jave.EncoderException;
import ws.schild.jave.MultimediaInfo;
import ws.schild.jave.MultimediaObject;

import java.io.File;
import java.io.IOException;
import java.util.Objects;
import java.util.UUID;

import static com.ruoyi.fjtseac.util.Constants.FALSE;

/**
 * 上传视频到本地临时文件夹（项目下的temp文件夹）用以获取时长，获取完后删除。
 *
 * @author zzl
 * @date 2022/7/19 21:31
 */
@Repository
public class LocalFile extends FileVerification{

    @Value("${path.localTemp}")
    private String temp;

    /**
     * 获取音频和视频长度。
     * @param file 目标文件
     * @param type 文件类型：video、audio、image
     * @return
     */
    public String getFileTime(MultipartFile file, String type) {
        String path = uploadToLocal(file, type);
        if (FALSE.equals(path)) {
            return null;
        }
        MultimediaObject multimediaObject = new MultimediaObject(new File(path));
        MultimediaInfo info;
        try {
            info = multimediaObject.getInfo();
        } catch (EncoderException e) {
            e.printStackTrace();
            return null;
        }
        long playTime = info.getDuration() / 1000;
        //成功后删除文件
        File tempFile = new File(path);
        if (tempFile.exists()) {
            boolean delete = tempFile.delete();
            if (!delete) {
                System.out.println("删除失败");
                return null;
            }
        }
        StringBuilder time = new StringBuilder();
        //应前端需求，音频返回秒数，视频时长使用"hh:mm:ss"的形式
        if(Objects.equals(type, Constants.VIDEO)) {
            time.append(String.format("%02d", playTime / 3600)).append(":").append(String.format("%02d" , (playTime / 60) % 60)).append(":").append(String.format("%02d" ,playTime % 60));
        }else {
            time.append(playTime);
        }
        return time.toString();
    }

    /**
     * 该方法于没有oss服务器时编写，为上传文件到本地的方法。
     * 用于保存视频、图片、音频的工具类，保存地址目前为本项目下的source文件夹下的对应video、image、audio目录。
     *
     * @param file 接收前端传入的文件
     * @param type 取值为：video、image、audio，用于指定具体存入的文件夹
     * @return "false"由于上传需要返回url存入数据库，故以“false”为失败的标志
     */
    private String uploadToLocal(MultipartFile file, String type) {
        //判断文件是否为空
        if (file.isEmpty()) {
            return FALSE;
        }
        //通过文件后缀过滤文件
        if (!extensionFilter(file, type)) {
            return FALSE;
        }
        // 获取文件名
        String fileName = file.getOriginalFilename();
        fileName = UUID.randomUUID() + "_" + fileName;
        //新建第一级目录
        File directory = new File(temp);
        if (!directory.exists()) {
            if (!directory.mkdirs()) {
                return FALSE;
            }
        }
        //创建文件对象
        File targetFile = new File(temp, fileName);
        //判断文件是否已经存在
        if (targetFile.exists()) {
            return FALSE;
        }
        try {
            //上传文件
            FileUtils.copyInputStreamToFile(file.getInputStream(), targetFile);
        } catch (IOException e) {
            return FALSE;
        }
        return temp + '/' + fileName;
    }
}
